<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>PF: 表</title>
<link rev="made" href="mailto:www@openbsd.org">
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="resource-type" content="document">
<meta name="description"   content="the OpenBSD FAQ page">
<meta name="keywords"      content="openbsd,faq,pf">
<meta name="distribution"  content="global">
</head>

<!--
Copyright (c) 2003, 2004 Joel Knight <enabled@myrealbox.com>

Permission to use, copy, modify, and distribute this documentation for
any purpose with or without fee is hereby granted, provided that the
above copyright notice and this permission notice appear in all copies.

THE DOCUMENTATION IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS DOCUMENTATION INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS DOCUMENTATION
-->

<body bgcolor="#ffffff" text="#000000">
<!-- Passes validator.w3.org, please keep it this way;
please, use a max of 72 chars per line -->

<a href="../../../zh/index.html">
<img alt="[OpenBSD]" height=30 width=141
    src="../../../images/smalltitle.gif" border="0">
</a>
<p>
[<a href="macros.html">上页: 列表与宏</a>]
[<a href="index.html">索引</a>]
[<a href="../filter.html">下页: 包过滤</a>]

<p>
<h1><font color="#e00000">PF: 表</font></h1>

<hr>

<h3>目录</h3>
<ul>
<li><a href="#intro">介绍</a>
<li><a href="#config">配置</a>
<li><a href="#manip"><tt>pfctl</tt> 操作</a>
<li><a href="#addr">指定地址</a>
<li><a href="#match">匹配地址</a>
</ul>

<hr>

<a name="intro"></a>
<h2>介绍</h2>
表用来保存 IPv4 和 IPv6 地址组。查询表非常快，而且比<a
href="macros.html#lists">列表</a>消耗的内存和处理器时间少。
所以，表用来保存大地址组非常完美，保存 50,000
个地址的表的查询时间比保存 50 个地址的列表稍多。
表可以用于下列场合:
<ul>
<li>
<a href="../filter.html">过滤器</a>中的源地址或目标地址，<a
href="scrub.html">擦洗</a>，<a href="../nat.html">NAT</a>
和<a href="../rdr.html">端口重定向</a>的规则。
<li><a href="../nat.html">NAT</a> 规则中的地址转换。
<li><a href="../rdr.html">端口重定向</a>规则中的重定向地址。
<li><tt>route-to</tt>，<tt>reply-to</tt> 和
<tt>dup-to</tt> 过滤器规则选项中的目标地址。
</ul>

<p>
表可以在
<a href="http://www.openbsd.org/cgi-bin/man.cgi?query=pf.conf&amp;sektion=5&amp;manpath=OpenBSD+4.3"
><tt>pf.conf</tt></a> 中创建或者用
<a href="http://www.openbsd.org/cgi-bin/man.cgi?query=pfctl&amp;sektion=8&amp;manpath=OpenBSD+4.3"
>pfctl(8)</a> 。

<a name="config"></a>
<h2>配置</h2>
在 <tt>pf.conf</tt>中，使用 <tt>table</tt> 关键字创建表。下述属性可以为每个表指定:
<ul>
<li><tt>const</tt> - 表的内容在创建后不能修改。当不指定此属性时，
<a href="http://www.openbsd.org/cgi-bin/man.cgi?query=pfctl&amp;sektion=8&amp;manpath=OpenBSD+4.3"
>pfctl(8)</a> 可能被用在任意时间对表增加或删除地址，即使系统运行在
<a href="http://www.openbsd.org/cgi-bin/man.cgi?query=securelevel&amp;sektion=7"
>securelevel(7)</a> 2 或更高的安全级别。
<li><tt>persist</tt> - 导致即使没有规则引用此表，内核也会把它保留在内存中。
如果没有指定这个属性，当最后引用表的规则被取消后，内核会自动把表从内存中删除。
</ul>

<p>
例子:
<blockquote>
<tt>
table &lt;goodguys&gt; { 192.0.2.0/24 }<br>
table &lt;rfc1918&gt; const { 192.168.0.0/16, 172.16.0.0/12, \<br>
&nbsp;&nbsp;&nbsp;10.0.0.0/8 }<br>
table &lt;spammers&gt; persist<br>
<br>
block in on fxp0 from { &lt;rfc1918&gt;, &lt;spammers&gt; } to any<br>
pass&nbsp; in on fxp0 from &lt;goodguys&gt; to any<br>
</tt>
</blockquote>

<p>
地址也可以用“非”来指定，例如:
<blockquote>
<tt>
table &lt;goodguys&gt; { 192.0.2.0/24, !192.0.2.5 }
</tt>
</blockquote>

<p>
<tt>goodguys</tt> 表将匹配除 192.0.2.5 以外 192.0.2.0/24 网段的所有地址。

<p>
注意表名总是在符号 &lt; &gt; 的里面。

<p>
表也可以由包含 IP 地址和网段地址列表的文本文件输入:
<blockquote>
<tt>
table &lt;spammers&gt; persist file "/etc/spammers"<br>
<br>
block in on fxp0 from &lt;spammers&gt; to any<br>
</tt>
</blockquote>

<p>
文件 <tt>/etc/spammers</tt> 将包含 IP 地址列表和/或
<a href="http://public.pacbell.net/dedicated/cidr.html">CIDR</a>
网段地址，每行一个。以 <tt>#</tt> 开始的行被看做注释，将被忽略。

<a name="manip"></a>
<h2><tt>pfctl</tt> 操作</tt></h2>
表可以使用
<a href="http://www.openbsd.org/cgi-bin/man.cgi?query=pfctl&amp;sektion=8&amp;manpath=OpenBSD+4.3"
>pfctl(8)</a> 进行灵活的操作。例如，向上面创建的表 &lt;spammers&gt; 增加条目:
<blockquote>
<tt># pfctl -t spammers -T add 218.70.0.0/16</tt>
</blockquote>

<p>
如果表 &lt;spammers&gt; 不存在，它将被创建。列出表中的地址:
<blockquote>
<tt># pfctl -t spammers -T show</tt>
</blockquote>
参数 <tt>-v</tt> 可以与 <tt>-T show</tt> 一起使用，来显示每个地址的统计数据。
从表中删除地址:
<blockquote>
<tt>
# pfctl -t spammers -T delete 218.70.0.0/16
</tt>
</blockquote>

<p>
要获得更多使用 <tt>pfctl</tt> 操作表的信息，请参阅
<a href="http://www.openbsd.org/cgi-bin/man.cgi?query=pfctl&amp;sektion=8&amp;manpath=OpenBSD+4.3"
>pfctl(8)</a> 手册页。

<a name="addr"></a>
<h2>指定地址</h2>
除了使用 IP 地址来指定主机外，也可以使用主机名。当主机名被解析成 IP 地址时，
所有的 IPv4 和 IPv6 地址都会被插进表中。IP 地址也可以通过合法的接口名称或者
<tt>self</tt> 关键字输入表中。这样的表会分别包含接口或者机器上(包括 loopback
地址)上配置的所有 IP 地址。<br>

<br>
一个限制就是当指定的地址是 <tt>0.0.0.0/0</tt> 或 <tt>0/0</tt> 时不能用于表。
替代方法是明确输入该地址或者使用<a href="macros.html#macros">宏</a>。

<a name="match"></a>
<h2>匹配地址</h2>
表中的地址查询会返回最精确的匹配条目。例如:
<blockquote>
<tt>
table &lt;goodguys&gt; { 172.16.0.0/16, !172.16.1.0/24, 172.16.1.100 }<br>
<br>
block in on dc0 all<br>
pass &nbsp;in on dc0 from &lt;goodguys&gt; to any<br>
</tt>
</blockquote>

<p>
任何进入 <tt>dc0</tt> 的数据包都会把它的源地址和表 <tt>&lt;goodguys&gt;</tt> 中的地址进行匹配:
<ul>
<li>172.16.50.5 - 精确匹配是 172.16.0.0/16; 数据包匹配表，可以通过
<li>172.16.1.25 - 精确匹配是 !172.16.1.0/24; 数据包匹配表中的否定条目(使用 “!” 修饰); 数据包不匹配表，会被阻塞
<li>172.16.1.100 - 准确匹配 172.16.1.100; 数据包匹配表，可以通过
<li>10.1.4.55 - 不匹配表，会被阻塞
</ul>

<p>
[<a href="macros.html">上页: 列表与宏</a>]
[<a href="index.html">索引</a>]
[<a href="../filter.html">下页: 包过滤</a>]

<p>
<hr>
<a href="index.html"><img height="24" width="24"
    src="../../../images/back.gif" border="0" alt="[back]"></a>
<a href="mailto:www@openbsd.org">www@openbsd.org</a>
<br>
<small>$OpenBSD: tables.html,v 1.23 2008/07/27 17:13:47 nick Exp $</small>

</body>
</html>
<!--
Originally [OpenBSD: tables.html,v 1.23]<br>
$Translation: tables.html,v 1.4 2008/08/05 04:10:03 dongsheng Exp $<br>
-->
